package com.hospital.register.cmn.service;

import com.hospital.register.common.exception.BusinessException;
import com.hospital.register.dto.cmn.DictExcelDto;
import com.hospital.register.dto.cmn.DictNameQueryDto;
import com.hospital.register.model.cmn.Dict;
import com.hospital.register.vo.cmn.DictChildVo;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.Future;

/**
 * 处理字典相关业务
 *
 * @author 刘逸晖
 */
public interface DictService {

    /**
     * 根据父 id 查数据
     *
     * @param parentId 父 id
     * @return 字典列表
     */
    List<DictChildVo> selectByParentId(Long parentId);

    /**
     * 设置字典中 hasChildren 的属性值
     *
     * @param dict 查询出的字典对象
     * @return 是否设置成功
     */
    Future<Boolean> hasChildren(DictChildVo dict);

    /**
     * 根据编码查询子节点
     *
     * @param dictCode 字典的编码
     * @return 子节点
     */
    List<DictChildVo> selectChildrenByCode(String dictCode);

    /**
     * 批量新增字典
     *
     * @param dictList 预新增的字典列表
     * @return 新增的记录数
     */
    int insertList(@Param("dictList") List<Dict> dictList);

    /**
     * 查询府河 Excel 格式的字典数据
     *
     * @return 字典列表
     */
    List<DictExcelDto> selectExcelData();

    /**
     * 批量删除字典数据
     *
     * @param idList 字典的 id 列表
     * @return 删除的字典数
     */
    int deleteList(List<Long> idList);

    /**
     * 查询是否有任一一个字典存在
     *
     * @param idCollection 字典的 id 列表
     * @return 有任一一个字典存在返回 true ，否则返回 false
     */
    boolean existAny(Collection<Long> idCollection);

    /**
     * 查询是否所有字典都存在
     *
     * @param idCollection 字典的 id 列表
     * @return 所有字典都存在返回 true ，否则返回 false
     */
    boolean existAll(Collection<Long> idCollection);

    /**
     * 检查每个字典是否违反约束
     *
     * @param dict  字典
     * @param index 这是校验的第几个字典
     *              校验失败后，在提示信息里会提示
     * @throws BusinessException 集合为空、某个字典为空、有非法字典
     */
    void violatedConstraints(DictExcelDto dict, int index) throws BusinessException;

    /**
     * 查询字典名称
     *
     * @param dto 查询条件
     * @return 字典名称
     */
    String selectName(DictNameQueryDto dto);

}
